<html>
 <head>
  <meta charset="utf-8"/>
  <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport"/>
  <title>
   hadoop 学习笔记之mapreduce框架详解  | 数螺 | NAUT IDEA
  </title>
  <link href="http://cdn.bootcss.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" rel="stylesheet"/>
  <link href="http://cdn.bootcss.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet"/>
  <style type="text/css">
   #xmain img {
                  max-width: 100%;
                  display: block;
                  margin-top: 10px;
                  margin-bottom: 10px;
                }

                #xmain p {
                    line-height:150%;
                    font-size: 16px;
                    margin-top: 20px;
                }

                #xmain h2 {
                    font-size: 24px;
                }

                #xmain h3 {
                    font-size: 20px;
                }

                #xmain h4 {
                    font-size: 18px;
                }


                .header {
	           background-color: #0099ff;
	           color: #ffffff;
	           margin-bottom: 20px;
	        }

	        .header p {
                  margin: 0px;
                  padding: 10px 0;
                  display: inline-block;  
                  vertical-align: middle;
                  font-size: 16px;
               }

               .header a {
                 color: white;
               }

              .header img {
                 height: 25px;
              }
  </style>
  <script src="http://cdn.bootcss.com/jquery/3.0.0/jquery.min.js">
  </script>
  <script src="http://nautstatic-10007657.file.myqcloud.com/static/css/readability.min.js" type="text/javascript">
  </script>
  <script type="text/javascript">
   $(document).ready(function() {
                 var loc = document.location;
                 var uri = {
                  spec: "http://dataunion.org/10337.html",
                  host: "http://dataunion.org",
                  prePath: "http://dataunion.org",
                  scheme: "http",
                  pathBase: "http://dataunion.org/"
                 };
    
                 var documentClone = document.cloneNode(true);
                 var article = new Readability(uri, documentClone).parse();
     
                 document.getElementById("xmain").innerHTML = article.content;
                });
  </script>
  <!-- 1466461356: Accept with keywords: (title(0.2):框架,社区,hadoop,笔记,数盟, topn(0.2):初始化,接下来,作业,数盟,程序员,任务,内存,运行机制,文件,配置文件,hadoop,基础架构,计算,文章,数据,阀值,图片,函数,问题,实例,分片,磁盘,客户端,框架,代码,程序,线程,版本,时候,阶段).-->
 </head>
 <body onload="">
  <div class="header">
   <div class="container">
    <div class="row">
     <div class="col-xs-6 col-sm-6 text-left">
      <a href="/databee">
       <img src="http://nautidea-10007657.cos.myqcloud.com/logo_white.png"/>
      </a>
      <a href="/databee">
       <p>
        数螺
       </p>
      </a>
     </div>
     <div class="hidden-xs col-sm-6 text-right">
      <p>
       致力于数据科学的推广和知识传播
      </p>
     </div>
    </div>
   </div>
  </div>
  <div class="container text-center">
   <h1>
    hadoop 学习笔记之mapreduce框架详解
   </h1>
  </div>
  <div class="container" id="xmain">
   ﻿﻿
   <title>
    hadoop 学习笔记之mapreduce框架详解 | 数盟社区
   </title>
   <!-- All in One SEO Pack 2.2.7.6.2 by Michael Torbert of Semper Fi Web Design[32,72] -->
   <!-- /all in one seo pack -->
   <!--
<div align="center">
<a href="http://strata.oreilly.com.cn/hadoop-big-data-cn?cmp=mp-data-confreg-home-stcn16_dataunion_pc" target="_blank"><img src="http://dataunion.org/wp-content/uploads/2016/05/stratabj.jpg"/ ></a>
</div>
-->
   <header id="header-web">
    <div class="header-main">
     <hgroup class="logo">
      <h1>
       <a href="http://dataunion.org/" rel="home" title="数盟社区">
        <img src="http://dataunion.org/wp-content/themes/yzipi/images/logo.png"/>
       </a>
      </h1>
     </hgroup>
     <!--logo-->
     <nav class="header-nav">
      <ul class="menu" id="menu-%e4%b8%bb%e8%8f%9c%e5%8d%95">
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-71" id="menu-item-71">
        <a href="http://dataunion.org/category/events" title="events">
         活动
        </a>
        <ul class="sub-menu">
         <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-22457" id="menu-item-22457">
          <a href="http://dataunion.org/2016timeline">
           2016档期
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-22459" id="menu-item-22459">
          <a href="http://dataunion.org/category/parterc">
           合作会议
          </a>
         </li>
        </ul>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor menu-item-has-children menu-item-20869" id="menu-item-20869">
        <a href="http://dataunion.org/category/tech" title="articles">
         文章
        </a>
        <ul class="sub-menu">
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent menu-item-20867" id="menu-item-20867">
          <a href="http://dataunion.org/category/tech/base" title="base">
           基础架构
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3302" id="menu-item-3302">
          <a href="http://dataunion.org/category/tech/ai" title="ai">
           人工智能
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3303" id="menu-item-3303">
          <a href="http://dataunion.org/category/tech/analysis" title="analysis">
           数据分析
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-21920" id="menu-item-21920">
          <a href="http://dataunion.org/category/tech/dm">
           数据挖掘
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3314" id="menu-item-3314">
          <a href="http://dataunion.org/category/tech/viz" title="viz">
           可视化
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-3305" id="menu-item-3305">
          <a href="http://dataunion.org/category/tech/devl" title="devl">
           编程语言
          </a>
         </li>
        </ul>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-20876" id="menu-item-20876">
        <a href="http://dataunion.org/category/industry">
         行业
        </a>
        <ul class="sub-menu">
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-16328" id="menu-item-16328">
          <a href="http://dataunion.org/category/industry/case" title="case">
           行业应用
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-2112" id="menu-item-2112">
          <a href="http://dataunion.org/category/industry/demo" title="demo">
           Demo展示
          </a>
         </li>
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-21562" id="menu-item-21562">
          <a href="http://dataunion.org/category/industry/news">
           行业资讯
          </a>
         </li>
        </ul>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-311" id="menu-item-311">
        <a href="http://dataunion.org/category/sources" title="sources">
         资源
        </a>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20870" id="menu-item-20870">
        <a href="http://dataunion.org/category/books" title="book">
         图书
        </a>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-21363" id="menu-item-21363">
        <a href="http://dataunion.org/category/training">
         课程
        </a>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-has-children menu-item-21853" id="menu-item-21853">
        <a href="http://dataunion.org/category/jobs">
         职位
        </a>
        <ul class="sub-menu">
         <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-22050" id="menu-item-22050">
          <a href="http://dataunion.org/category/career">
           职业规划
          </a>
         </li>
        </ul>
       </li>
      </ul>
     </nav>
     <!--header-nav-->
    </div>
   </header>
   <!--header-web-->
   <div id="main">
    <div id="soutab">
     <form action="http://dataunion.org/" class="search" method="get">
     </form>
    </div>
    <div id="container">
     <nav id="mbx">
      当前位置：
      <a href="http://dataunion.org">
       首页
      </a>
      &gt;
      <a href="http://dataunion.org/category/tech">
       文章
      </a>
      &gt;
      <a href="http://dataunion.org/category/tech/base">
       基础架构
      </a>
      &gt;  正文
     </nav>
     <!--mbx-->
     <article class="content">
      <header align="centre" class="contenttitle">
       <div class="mscc">
        <h1 class="mscctitle">
         <a href="http://dataunion.org/10337.html">
          hadoop 学习笔记之mapreduce框架详解
         </a>
        </h1>
        <address class="msccaddress ">
         <em>
          2,191 次阅读 -
         </em>
         <a href="http://dataunion.org/category/tech/base" rel="category tag">
          基础架构
         </a>
        </address>
       </div>
      </header>
      <div class="content-text">
       <p>
        作者：
        <a class="headermaintitle" href="http://www.cnblogs.com/sharpxiajun/" id="Header1_HeaderTitle">
         夏天的森林
        </a>
       </p>
       <p>
        开始聊mapreduce，mapreduce是hadoop的计算框架，我学hadoop是从hive开始入手，再到hdfs，当我学习hdfs时候，就感觉到hdfs和mapreduce关系的紧密。这个可能是我做技术研究的思路有关，我开始学习某一套技术总是想着这套技术到底能干什么，只有当我真正理解了这套技术解决了什么问题时候，我后续的学习就能逐步的加快，而学习hdfs时候我就发现，要理解hadoop框架的意义，hdfs和mapreduce是密不可分，所以当我写分布式文件系统时候，总是感觉自己的理解肤浅，今天我开始写mapreduce了，今天写文章时候比上周要进步多，不过到底能不能写好本文了，只有试试再说了。
       </p>
       <p>
        <strong>
         Mapreduce
        </strong>
        <strong>
         初析
        </strong>
       </p>
       <p>
        Mapreduce是一个计算框架，既然是做计算的框架，那么表现形式就是有个输入（input），mapreduce操作这个输入（input），通过本身定义好的计算模型，得到一个输出（output），这个输出就是我们所需要的结果。
       </p>
       <p>
        我们要学习的就是这个计算模型的运行规则。在运行一个mapreduce计算任务时候，任务过程被分为两个阶段：map阶段和reduce阶段，每个阶段都是用键值对（key/value）作为输入（input）和输出（output）。而程序员要做的就是定义好这两个阶段的函数：map函数和reduce函数。
       </p>
       <p>
        <strong>
         Mapreduce
        </strong>
        <strong>
         的基础实例
        </strong>
       </p>
       <p>
        讲解mapreduce运行原理前，首先我们看看mapreduce里的hello world实例WordCount,这个实例在任何一个版本的hadoop安装程序里都会有，大家很容易找到，这里我还是贴出代码，便于我后面的讲解，代码如下：
       </p>
       <div class="cnblogs_Highlighter">
        <div>
         <div class="syntaxhighlighter nogutter java" id="highlighter_148979">
          <table border="0" cellpadding="0" cellspacing="0">
           <tbody>
            <tr>
             <td class="code">
              <div class="container">
               <div class="line number1 index0 alt2">
                <code class="java preprocessor">
                 /**
                </code>
               </div>
               <div class="line number2 index1 alt1">
                <code class="java spaces">
                </code>
                <code class="java preprocessor">
                 * Licensed to the Apache Software Foundation (ASF) under one
                </code>
               </div>
               <div class="line number3 index2 alt2">
                <code class="java spaces">
                </code>
                <code class="java preprocessor">
                 * or more contributor license agreements.  See the NOTICE file
                </code>
               </div>
               <div class="line number4 index3 alt1">
                <code class="java spaces">
                </code>
                <code class="java preprocessor">
                 * distributed with this work for additional information
                </code>
               </div>
               <div class="line number5 index4 alt2">
                <code class="java spaces">
                </code>
                <code class="java preprocessor">
                 * regarding copyright ownership.  The ASF licenses this file
                </code>
               </div>
               <div class="line number6 index5 alt1">
                <code class="java spaces">
                </code>
                <code class="java preprocessor">
                 * to you under the Apache License, Version 2.0 (the
                </code>
               </div>
               <div class="line number7 index6 alt2">
                <code class="java spaces">
                </code>
                <code class="java preprocessor">
                 * "License"); you may not use this file except in compliance
                </code>
               </div>
               <div class="line number8 index7 alt1">
                <code class="java spaces">
                </code>
                <code class="java preprocessor">
                 * with the License.  You may obtain a copy of the License at
                </code>
               </div>
               <div class="line number9 index8 alt2">
                <code class="java spaces">
                </code>
                <code class="java preprocessor">
                 *
                </code>
               </div>
               <div class="line number10 index9 alt1">
                <code class="java spaces">
                </code>
                <code class="java preprocessor">
                 *
                 <a href="http://www.apache.org/licenses/LICENSE-2.0">
                  http://www.apache.org/licenses/LICENSE-2.0
                 </a>
                </code>
               </div>
               <div class="line number11 index10 alt2">
                <code class="java spaces">
                </code>
                <code class="java preprocessor">
                 *
                </code>
               </div>
               <div class="line number12 index11 alt1">
                <code class="java spaces">
                </code>
                <code class="java preprocessor">
                 * Unless required by applicable law or agreed to in writing, software
                </code>
               </div>
               <div class="line number13 index12 alt2">
                <code class="java spaces">
                </code>
                <code class="java preprocessor">
                 * distributed under the License is distributed on an "AS IS" BASIS,
                </code>
               </div>
               <div class="line number14 index13 alt1">
                <code class="java spaces">
                </code>
                <code class="java preprocessor">
                 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
                </code>
               </div>
               <div class="line number15 index14 alt2">
                <code class="java spaces">
                </code>
                <code class="java preprocessor">
                 * See the License for the specific language governing permissions and
                </code>
               </div>
               <div class="line number16 index15 alt1">
                <code class="java spaces">
                </code>
                <code class="java preprocessor">
                 * limitations under the License.
                </code>
               </div>
               <div class="line number17 index16 alt2">
                <code class="java spaces">
                </code>
                <code class="java preprocessor">
                 */
                </code>
               </div>
               <div class="line number18 index17 alt1">
                <code class="java keyword">
                 package
                </code>
                <code class="java plain">
                 org.apache.hadoop.examples;
                </code>
               </div>
               <div class="line number19 index18 alt2">
               </div>
               <div class="line number20 index19 alt1">
                <code class="java keyword">
                 import
                </code>
                <code class="java plain">
                 java.io.IOException;
                </code>
               </div>
               <div class="line number21 index20 alt2">
                <code class="java keyword">
                 import
                </code>
                <code class="java plain">
                 java.util.StringTokenizer;
                </code>
               </div>
               <div class="line number22 index21 alt1">
               </div>
               <div class="line number23 index22 alt2">
                <code class="java keyword">
                 import
                </code>
                <code class="java plain">
                 org.apache.hadoop.conf.Configuration;
                </code>
               </div>
               <div class="line number24 index23 alt1">
                <code class="java keyword">
                 import
                </code>
                <code class="java plain">
                 org.apache.hadoop.fs.Path;
                </code>
               </div>
               <div class="line number25 index24 alt2">
                <code class="java keyword">
                 import
                </code>
                <code class="java plain">
                 org.apache.hadoop.io.IntWritable;
                </code>
               </div>
               <div class="line number26 index25 alt1">
                <code class="java keyword">
                 import
                </code>
                <code class="java plain">
                 org.apache.hadoop.io.Text;
                </code>
               </div>
               <div class="line number27 index26 alt2">
                <code class="java keyword">
                 import
                </code>
                <code class="java plain">
                 org.apache.hadoop.mapreduce.Job;
                </code>
               </div>
               <div class="line number28 index27 alt1">
                <code class="java keyword">
                 import
                </code>
                <code class="java plain">
                 org.apache.hadoop.mapreduce.Mapper;
                </code>
               </div>
               <div class="line number29 index28 alt2">
                <code class="java keyword">
                 import
                </code>
                <code class="java plain">
                 org.apache.hadoop.mapreduce.Reducer;
                </code>
               </div>
               <div class="line number30 index29 alt1">
                <code class="java keyword">
                 import
                </code>
                <code class="java plain">
                 org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
                </code>
               </div>
               <div class="line number31 index30 alt2">
                <code class="java keyword">
                 import
                </code>
                <code class="java plain">
                 org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
                </code>
               </div>
               <div class="line number32 index31 alt1">
                <code class="java keyword">
                 import
                </code>
                <code class="java plain">
                 org.apache.hadoop.util.GenericOptionsParser;
                </code>
               </div>
               <div class="line number33 index32 alt2">
               </div>
               <div class="line number34 index33 alt1">
                <code class="java keyword">
                 public
                </code>
                <code class="java keyword">
                 class
                </code>
                <code class="java plain">
                 WordCount {
                </code>
               </div>
               <div class="line number35 index34 alt2">
               </div>
               <div class="line number36 index35 alt1">
                <code class="java spaces">
                </code>
                <code class="java keyword">
                 public
                </code>
                <code class="java keyword">
                 static
                </code>
                <code class="java keyword">
                 class
                </code>
                <code class="java plain">
                 TokenizerMapper
                </code>
               </div>
               <div class="line number37 index36 alt2">
                <code class="java spaces">
                </code>
                <code class="java keyword">
                 extends
                </code>
                <code class="java plain">
                 Mapper&lt;Object, Text, Text, IntWritable&gt;{
                </code>
               </div>
               <div class="line number38 index37 alt1">
                <code class="java spaces">
                </code>
               </div>
               <div class="line number39 index38 alt2">
                <code class="java spaces">
                </code>
                <code class="java keyword">
                 private
                </code>
                <code class="java keyword">
                 final
                </code>
                <code class="java keyword">
                 static
                </code>
                <code class="java plain">
                 IntWritable one =
                </code>
                <code class="java keyword">
                 new
                </code>
                <code class="java plain">
                 IntWritable(
                </code>
                <code class="java value">
                 1
                </code>
                <code class="java plain">
                 );
                </code>
               </div>
               <div class="line number40 index39 alt1">
                <code class="java spaces">
                </code>
                <code class="java keyword">
                 private
                </code>
                <code class="java plain">
                 Text word =
                </code>
                <code class="java keyword">
                 new
                </code>
                <code class="java plain">
                 Text();
                </code>
               </div>
               <div class="line number41 index40 alt2">
                <code class="java spaces">
                </code>
               </div>
               <div class="line number42 index41 alt1">
                <code class="java spaces">
                </code>
                <code class="java keyword">
                 public
                </code>
                <code class="java keyword">
                 void
                </code>
                <code class="java plain">
                 map(Object key, Text value, Context context
                </code>
               </div>
               <div class="line number43 index42 alt2">
                <code class="java spaces">
                </code>
                <code class="java plain">
                 )
                </code>
                <code class="java keyword">
                 throws
                </code>
                <code class="java plain">
                 IOException, InterruptedException {
                </code>
               </div>
               <div class="line number44 index43 alt1">
                <code class="java spaces">
                </code>
                <code class="java plain">
                 StringTokenizer itr =
                </code>
                <code class="java keyword">
                 new
                </code>
                <code class="java plain">
                 StringTokenizer(value.toString());
                </code>
               </div>
               <div class="line number45 index44 alt2">
                <code class="java spaces">
                </code>
                <code class="java keyword">
                 while
                </code>
                <code class="java plain">
                 (itr.hasMoreTokens()) {
                </code>
               </div>
               <div class="line number46 index45 alt1">
                <code class="java spaces">
                </code>
                <code class="java plain">
                 word.set(itr.nextToken());
                </code>
               </div>
               <div class="line number47 index46 alt2">
                <code class="java spaces">
                </code>
                <code class="java plain">
                 context.write(word, one);
                </code>
               </div>
               <div class="line number48 index47 alt1">
                <code class="java spaces">
                </code>
                <code class="java plain">
                 }
                </code>
               </div>
               <div class="line number49 index48 alt2">
                <code class="java spaces">
                </code>
                <code class="java plain">
                 }
                </code>
               </div>
               <div class="line number50 index49 alt1">
                <code class="java spaces">
                </code>
                <code class="java plain">
                 }
                </code>
               </div>
               <div class="line number51 index50 alt2">
                <code class="java spaces">
                </code>
               </div>
               <div class="line number52 index51 alt1">
                <code class="java spaces">
                </code>
                <code class="java keyword">
                 public
                </code>
                <code class="java keyword">
                 static
                </code>
                <code class="java keyword">
                 class
                </code>
                <code class="java plain">
                 IntSumReducer
                </code>
               </div>
               <div class="line number53 index52 alt2">
                <code class="java spaces">
                </code>
                <code class="java keyword">
                 extends
                </code>
                <code class="java plain">
                 Reducer&lt;Text,IntWritable,Text,IntWritable&gt; {
                </code>
               </div>
               <div class="line number54 index53 alt1">
                <code class="java spaces">
                </code>
                <code class="java keyword">
                 private
                </code>
                <code class="java plain">
                 IntWritable result =
                </code>
                <code class="java keyword">
                 new
                </code>
                <code class="java plain">
                 IntWritable();
                </code>
               </div>
               <div class="line number55 index54 alt2">
               </div>
               <div class="line number56 index55 alt1">
                <code class="java spaces">
                </code>
                <code class="java keyword">
                 public
                </code>
                <code class="java keyword">
                 void
                </code>
                <code class="java plain">
                 reduce(Text key, Iterable&lt;IntWritable&gt; values,
                </code>
               </div>
               <div class="line number57 index56 alt2">
                <code class="java spaces">
                </code>
                <code class="java plain">
                 Context context
                </code>
               </div>
               <div class="line number58 index57 alt1">
                <code class="java spaces">
                </code>
                <code class="java plain">
                 )
                </code>
                <code class="java keyword">
                 throws
                </code>
                <code class="java plain">
                 IOException, InterruptedException {
                </code>
               </div>
               <div class="line number59 index58 alt2">
                <code class="java spaces">
                </code>
                <code class="java keyword">
                 int
                </code>
                <code class="java plain">
                 sum =
                </code>
                <code class="java value">
                 0
                </code>
                <code class="java plain">
                 ;
                </code>
               </div>
               <div class="line number60 index59 alt1">
                <code class="java spaces">
                </code>
                <code class="java keyword">
                 for
                </code>
                <code class="java plain">
                 (IntWritable val : values) {
                </code>
               </div>
               <div class="line number61 index60 alt2">
                <code class="java spaces">
                </code>
                <code class="java plain">
                 sum += val.get();
                </code>
               </div>
               <div class="line number62 index61 alt1">
                <code class="java spaces">
                </code>
                <code class="java plain">
                 }
                </code>
               </div>
               <div class="line number63 index62 alt2">
                <code class="java spaces">
                </code>
                <code class="java plain">
                 result.set(sum);
                </code>
               </div>
               <div class="line number64 index63 alt1">
                <code class="java spaces">
                </code>
                <code class="java plain">
                 context.write(key, result);
                </code>
               </div>
               <div class="line number65 index64 alt2">
                <code class="java spaces">
                </code>
                <code class="java plain">
                 }
                </code>
               </div>
               <div class="line number66 index65 alt1">
                <code class="java spaces">
                </code>
                <code class="java plain">
                 }
                </code>
               </div>
               <div class="line number67 index66 alt2">
               </div>
               <div class="line number68 index67 alt1">
                <code class="java spaces">
                </code>
                <code class="java keyword">
                 public
                </code>
                <code class="java keyword">
                 static
                </code>
                <code class="java keyword">
                 void
                </code>
                <code class="java plain">
                 main(String[] args)
                </code>
                <code class="java keyword">
                 throws
                </code>
                <code class="java plain">
                 Exception {
                </code>
               </div>
               <div class="line number69 index68 alt2">
                <code class="java spaces">
                </code>
                <code class="java plain">
                 Configuration conf =
                </code>
                <code class="java keyword">
                 new
                </code>
                <code class="java plain">
                 Configuration();
                </code>
               </div>
               <div class="line number70 index69 alt1">
                <code class="java spaces">
                </code>
                <code class="java plain">
                 String[] otherArgs =
                </code>
                <code class="java keyword">
                 new
                </code>
                <code class="java plain">
                 GenericOptionsParser(conf, args).getRemainingArgs();
                </code>
               </div>
               <div class="line number71 index70 alt2">
                <code class="java spaces">
                </code>
                <code class="java keyword">
                 if
                </code>
                <code class="java plain">
                 (otherArgs.length !=
                </code>
                <code class="java value">
                 2
                </code>
                <code class="java plain">
                 ) {
                </code>
               </div>
               <div class="line number72 index71 alt1">
                <code class="java spaces">
                </code>
                <code class="java plain">
                 System.err.println(
                </code>
                <code class="java string">
                 "Usage: wordcount &lt;in&gt; &lt;out&gt;"
                </code>
                <code class="java plain">
                 );
                </code>
               </div>
               <div class="line number73 index72 alt2">
                <code class="java spaces">
                </code>
                <code class="java plain">
                 System.exit(
                </code>
                <code class="java value">
                 2
                </code>
                <code class="java plain">
                 );
                </code>
               </div>
               <div class="line number74 index73 alt1">
                <code class="java spaces">
                </code>
                <code class="java plain">
                 }
                </code>
               </div>
               <div class="line number75 index74 alt2">
                <code class="java spaces">
                </code>
                <code class="java plain">
                 Job job =
                </code>
                <code class="java keyword">
                 new
                </code>
                <code class="java plain">
                 Job(conf,
                </code>
                <code class="java string">
                 "word count"
                </code>
                <code class="java plain">
                 );
                </code>
               </div>
               <div class="line number76 index75 alt1">
                <code class="java spaces">
                </code>
                <code class="java plain">
                 job.setJarByClass(WordCount.
                </code>
                <code class="java keyword">
                 class
                </code>
                <code class="java plain">
                 );
                </code>
               </div>
               <div class="line number77 index76 alt2">
                <code class="java spaces">
                </code>
                <code class="java plain">
                 job.setMapperClass(TokenizerMapper.
                </code>
                <code class="java keyword">
                 class
                </code>
                <code class="java plain">
                 );
                </code>
               </div>
               <div class="line number78 index77 alt1">
                <code class="java spaces">
                </code>
                <code class="java plain">
                 job.setCombinerClass(IntSumReducer.
                </code>
                <code class="java keyword">
                 class
                </code>
                <code class="java plain">
                 );
                </code>
               </div>
               <div class="line number79 index78 alt2">
                <code class="java spaces">
                </code>
                <code class="java plain">
                 job.setReducerClass(IntSumReducer.
                </code>
                <code class="java keyword">
                 class
                </code>
                <code class="java plain">
                 );
                </code>
               </div>
               <div class="line number80 index79 alt1">
                <code class="java spaces">
                </code>
                <code class="java plain">
                 job.setOutputKeyClass(Text.
                </code>
                <code class="java keyword">
                 class
                </code>
                <code class="java plain">
                 );
                </code>
               </div>
               <div class="line number81 index80 alt2">
                <code class="java spaces">
                </code>
                <code class="java plain">
                 job.setOutputValueClass(IntWritable.
                </code>
                <code class="java keyword">
                 class
                </code>
                <code class="java plain">
                 );
                </code>
               </div>
               <div class="line number82 index81 alt1">
                <code class="java spaces">
                </code>
                <code class="java plain">
                 FileInputFormat.addInputPath(job,
                </code>
                <code class="java keyword">
                 new
                </code>
                <code class="java plain">
                 Path(otherArgs[
                </code>
                <code class="java value">
                 0
                </code>
                <code class="java plain">
                 ]));
                </code>
               </div>
               <div class="line number83 index82 alt2">
                <code class="java spaces">
                </code>
                <code class="java plain">
                 FileOutputFormat.setOutputPath(job,
                </code>
                <code class="java keyword">
                 new
                </code>
                <code class="java plain">
                 Path(otherArgs[
                </code>
                <code class="java value">
                 1
                </code>
                <code class="java plain">
                 ]));
                </code>
               </div>
               <div class="line number84 index83 alt1">
                <code class="java spaces">
                </code>
                <code class="java plain">
                 System.exit(job.waitForCompletion(
                </code>
                <code class="java keyword">
                 true
                </code>
                <code class="java plain">
                 ) ?
                </code>
                <code class="java value">
                 0
                </code>
                <code class="java plain">
                 :
                </code>
                <code class="java value">
                 1
                </code>
                <code class="java plain">
                 );
                </code>
               </div>
               <div class="line number85 index84 alt2">
                <code class="java spaces">
                </code>
                <code class="java plain">
                 }
                </code>
               </div>
               <div class="line number86 index85 alt1">
                <code class="java plain">
                 }
                </code>
               </div>
              </div>
             </td>
            </tr>
           </tbody>
          </table>
         </div>
        </div>
       </div>
       <p>
       </p>
       <p>
        如何运行它，这里不做累述了，大伙可以百度下，网上这方面的资料很多。这里的实例代码是使用新的api，大家可能在很多书籍里看到讲解mapreduce的WordCount实例都是老版本的api，这里我不给出老版本的api，因为老版本的api不太建议使用了，大家做开发最好使用新版本的api，新版本api和旧版本api有区别在哪里：
       </p>
       <ol>
        <li>
         新的api放在：org.apache.hadoop.mapreduce,旧版api放在：org.apache.hadoop.mapred
        </li>
        <li>
         新版api使用虚类，而旧版的使用的是接口，虚类更加利于扩展，这个是一个经验，大家可以好好学习下hadoop的这个经验。
        </li>
       </ol>
       <p>
        其他还有很多区别，都是说明新版本api的优势，因为我提倡使用新版api，这里就不讲这些，因为没必要再用旧版本，因此这种比较也没啥意义了。
       </p>
       <p>
        下面我对代码做简单的讲解，大家看到要写一个mapreduce程序，我们的实现一个map函数和reduce函数。我们看看map的方法：
       </p>
       <div class="cnblogs_code">
        <!-- Crayon Syntax Highlighter v_2.7.2_beta -->
        <div class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover" id="crayon-57686c9c086e5243027863" style=" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;">
         <div class="crayon-toolbar" data-settings=" mouseover overlay hide delay" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;">
          <span class="crayon-title">
          </span>
          <div class="crayon-tools" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;">
           <div class="crayon-button crayon-nums-button" title="切换是否显示行编号">
            <div class="crayon-button-icon">
            </div>
           </div>
           <div class="crayon-button crayon-plain-button" title="纯文本显示代码">
            <div class="crayon-button-icon">
            </div>
           </div>
           <div class="crayon-button crayon-wrap-button" title="切换自动换行">
            <div class="crayon-button-icon">
            </div>
           </div>
           <div class="crayon-button crayon-expand-button" title="点击展开代码">
            <div class="crayon-button-icon">
            </div>
           </div>
           <div class="crayon-button crayon-copy-button" title="复制代码">
            <div class="crayon-button-icon">
            </div>
           </div>
           <div class="crayon-button crayon-popup-button" title="在新窗口中显示代码">
            <div class="crayon-button-icon">
            </div>
           </div>
          </div>
         </div>
         <div class="crayon-info" style="min-height: 16.8px !important; line-height: 16.8px !important;">
         </div>
         <div class="crayon-plain-wrap">
          <textarea class="crayon-plain print-no" data-settings="dblclick" readonly="" style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;" wrap="soft">
           public void map(Object key, Text value, Context context) throws IOException, InterruptedException {…}
          </textarea>
         </div>
         <div class="crayon-main" style="">
          <table class="crayon-table">
           <tbody>
            <tr class="crayon-row">
             <td class="crayon-nums " data-settings="show">
              <div class="crayon-nums-content" style="font-size: 12px !important; line-height: 15px !important;">
               <div class="crayon-num" data-line="crayon-57686c9c086e5243027863-1">
                1
               </div>
              </div>
             </td>
             <td class="crayon-code">
              <div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;">
               <div class="crayon-line" id="crayon-57686c9c086e5243027863-1">
                <span class="crayon-m">
                 public
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-t">
                 void
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-e">
                 map
                </span>
                <span class="crayon-sy">
                 (
                </span>
                <span class="crayon-t">
                 Object
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-v">
                 key
                </span>
                <span class="crayon-sy">
                 ,
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-e">
                 Text
                </span>
                <span class="crayon-v">
                 value
                </span>
                <span class="crayon-sy">
                 ,
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-e">
                 Context
                </span>
                <span class="crayon-v">
                 context
                </span>
                <span class="crayon-sy">
                 )
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-e">
                 throws
                </span>
                <span class="crayon-v">
                 IOException
                </span>
                <span class="crayon-sy">
                 ,
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-e">
                 InterruptedException
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-sy">
                 {
                </span>
                …
                <span class="crayon-sy">
                 }
                </span>
               </div>
              </div>
             </td>
            </tr>
           </tbody>
          </table>
         </div>
        </div>
        <!-- [Format Time: 0.0114 seconds] -->
       </div>
       <p>
        这里有三个参数，前面两个Object key, Text value就是输入的key和value，第三个参数Context context这是可以记录输入的key和value，例如：context.write(word, one);此外context还会记录map运算的状态。
       </p>
       <p>
        对于reduce函数的方法：
       </p>
       <div class="cnblogs_code">
        <!-- Crayon Syntax Highlighter v_2.7.2_beta -->
        <div class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover" id="crayon-57686c9c086f8010599749" style=" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;">
         <div class="crayon-toolbar" data-settings=" mouseover overlay hide delay" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;">
          <span class="crayon-title">
          </span>
          <div class="crayon-tools" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;">
           <div class="crayon-button crayon-nums-button" title="切换是否显示行编号">
            <div class="crayon-button-icon">
            </div>
           </div>
           <div class="crayon-button crayon-plain-button" title="纯文本显示代码">
            <div class="crayon-button-icon">
            </div>
           </div>
           <div class="crayon-button crayon-wrap-button" title="切换自动换行">
            <div class="crayon-button-icon">
            </div>
           </div>
           <div class="crayon-button crayon-expand-button" title="点击展开代码">
            <div class="crayon-button-icon">
            </div>
           </div>
           <div class="crayon-button crayon-copy-button" title="复制代码">
            <div class="crayon-button-icon">
            </div>
           </div>
           <div class="crayon-button crayon-popup-button" title="在新窗口中显示代码">
            <div class="crayon-button-icon">
            </div>
           </div>
          </div>
         </div>
         <div class="crayon-info" style="min-height: 16.8px !important; line-height: 16.8px !important;">
         </div>
         <div class="crayon-plain-wrap">
          <textarea class="crayon-plain print-no" data-settings="dblclick" readonly="" style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;" wrap="soft">
           public void reduce(Text key, Iterable&amp;lt;IntWritable&amp;gt; values, Context context) throws IOException, InterruptedException {…}
          </textarea>
         </div>
         <div class="crayon-main" style="">
          <table class="crayon-table">
           <tbody>
            <tr class="crayon-row">
             <td class="crayon-nums " data-settings="show">
              <div class="crayon-nums-content" style="font-size: 12px !important; line-height: 15px !important;">
               <div class="crayon-num" data-line="crayon-57686c9c086f8010599749-1">
                1
               </div>
              </div>
             </td>
             <td class="crayon-code">
              <div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;">
               <div class="crayon-line" id="crayon-57686c9c086f8010599749-1">
                <span class="crayon-m">
                 public
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-t">
                 void
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-e">
                 reduce
                </span>
                <span class="crayon-sy">
                 (
                </span>
                <span class="crayon-e">
                 Text
                </span>
                <span class="crayon-v">
                 key
                </span>
                <span class="crayon-sy">
                 ,
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-v">
                 Iterable
                </span>
                <span class="crayon-o">
                 &amp;
                </span>
                <span class="crayon-v">
                 lt
                </span>
                <span class="crayon-sy">
                 ;
                </span>
                <span class="crayon-v">
                 IntWritable
                </span>
                <span class="crayon-o">
                 &amp;
                </span>
                <span class="crayon-v">
                 gt
                </span>
                <span class="crayon-sy">
                 ;
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-v">
                 values
                </span>
                <span class="crayon-sy">
                 ,
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-e">
                 Context
                </span>
                <span class="crayon-v">
                 context
                </span>
                <span class="crayon-sy">
                 )
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-e">
                 throws
                </span>
                <span class="crayon-v">
                 IOException
                </span>
                <span class="crayon-sy">
                 ,
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-e">
                 InterruptedException
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-sy">
                 {
                </span>
                …
                <span class="crayon-sy">
                 }
                </span>
               </div>
              </div>
             </td>
            </tr>
           </tbody>
          </table>
         </div>
        </div>
        <!-- [Format Time: 0.0016 seconds] -->
       </div>
       <p>
        reduce函数的输入也是一个key/value的形式，不过它的value是一个迭代器的形式Iterable&lt;IntWritable&gt; values，也就是说reduce的输入是一个key对应一组的值的value，reduce也有context和map的context作用一致。
       </p>
       <p>
        至于计算的逻辑就是程序员自己去实现了。
       </p>
       <p>
        下面就是main函数的调用了，这个我要详细讲述下，首先是：
       </p>
       <div class="cnblogs_code">
        <!-- Crayon Syntax Highlighter v_2.7.2_beta -->
        <div class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover" id="crayon-57686c9c086ff326643643" style=" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;">
         <div class="crayon-toolbar" data-settings=" mouseover overlay hide delay" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;">
          <span class="crayon-title">
          </span>
          <div class="crayon-tools" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;">
           <div class="crayon-button crayon-nums-button" title="切换是否显示行编号">
            <div class="crayon-button-icon">
            </div>
           </div>
           <div class="crayon-button crayon-plain-button" title="纯文本显示代码">
            <div class="crayon-button-icon">
            </div>
           </div>
           <div class="crayon-button crayon-wrap-button" title="切换自动换行">
            <div class="crayon-button-icon">
            </div>
           </div>
           <div class="crayon-button crayon-expand-button" title="点击展开代码">
            <div class="crayon-button-icon">
            </div>
           </div>
           <div class="crayon-button crayon-copy-button" title="复制代码">
            <div class="crayon-button-icon">
            </div>
           </div>
           <div class="crayon-button crayon-popup-button" title="在新窗口中显示代码">
            <div class="crayon-button-icon">
            </div>
           </div>
          </div>
         </div>
         <div class="crayon-info" style="min-height: 16.8px !important; line-height: 16.8px !important;">
         </div>
         <div class="crayon-plain-wrap">
          <textarea class="crayon-plain print-no" data-settings="dblclick" readonly="" style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;" wrap="soft">
           Configuration conf = new Configuration();
          </textarea>
         </div>
         <div class="crayon-main" style="">
          <table class="crayon-table">
           <tbody>
            <tr class="crayon-row">
             <td class="crayon-nums " data-settings="show">
              <div class="crayon-nums-content" style="font-size: 12px !important; line-height: 15px !important;">
               <div class="crayon-num" data-line="crayon-57686c9c086ff326643643-1">
                1
               </div>
              </div>
             </td>
             <td class="crayon-code">
              <div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;">
               <div class="crayon-line" id="crayon-57686c9c086ff326643643-1">
                <span class="crayon-e">
                 Configuration
                </span>
                <span class="crayon-v">
                 conf
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-o">
                 =
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-r">
                 new
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-e">
                 Configuration
                </span>
                <span class="crayon-sy">
                 (
                </span>
                <span class="crayon-sy">
                 )
                </span>
                <span class="crayon-sy">
                 ;
                </span>
               </div>
              </div>
             </td>
            </tr>
           </tbody>
          </table>
         </div>
        </div>
        <!-- [Format Time: 0.0009 seconds] -->
       </div>
       <p>
        运行mapreduce程序前都要初始化Configuration，该类主要是读取mapreduce系统配置信息，这些信息包括hdfs还有mapreduce，也就是安装hadoop时候的配置文件例如：core-site.xml、hdfs-site.xml和mapred-site.xml等等文件里的信息，有些童鞋不理解为啥要这么做，这个是没有深入思考mapreduce计算框架造成，我们程序员开发mapreduce时候只是在填空，在map函数和reduce函数里编写实际进行的业务逻辑，其它的工作都是交给mapreduce框架自己操作的，但是至少我们要告诉它怎么操作啊，比如hdfs在哪里啊，mapreduce的jobstracker在哪里啊，而这些信息就在conf包下的配置文件里。
       </p>
       <p>
        接下来的代码是：
       </p>
       <div class="cnblogs_code">
        <!-- Crayon Syntax Highlighter v_2.7.2_beta -->
        <div class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover" id="crayon-57686c9c08706089098219" style=" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;">
         <div class="crayon-toolbar" data-settings=" mouseover overlay hide delay" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;">
          <span class="crayon-title">
          </span>
          <div class="crayon-tools" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;">
           <div class="crayon-button crayon-nums-button" title="切换是否显示行编号">
            <div class="crayon-button-icon">
            </div>
           </div>
           <div class="crayon-button crayon-plain-button" title="纯文本显示代码">
            <div class="crayon-button-icon">
            </div>
           </div>
           <div class="crayon-button crayon-wrap-button" title="切换自动换行">
            <div class="crayon-button-icon">
            </div>
           </div>
           <div class="crayon-button crayon-expand-button" title="点击展开代码">
            <div class="crayon-button-icon">
            </div>
           </div>
           <div class="crayon-button crayon-copy-button" title="复制代码">
            <div class="crayon-button-icon">
            </div>
           </div>
           <div class="crayon-button crayon-popup-button" title="在新窗口中显示代码">
            <div class="crayon-button-icon">
            </div>
           </div>
          </div>
         </div>
         <div class="crayon-info" style="min-height: 16.8px !important; line-height: 16.8px !important;">
         </div>
         <div class="crayon-plain-wrap">
          <textarea class="crayon-plain print-no" data-settings="dblclick" readonly="" style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;" wrap="soft">
           String[] otherArgs = new GenericOptionsParser(conf, args).getRemainingArgs();
    if (otherArgs.length != 2) {
      System.err.println("Usage: wordcount &amp;lt;in&amp;gt; &amp;lt;out&amp;gt;");
      System.exit(2);
    }
          </textarea>
         </div>
         <div class="crayon-main" style="">
          <table class="crayon-table">
           <tbody>
            <tr class="crayon-row">
             <td class="crayon-nums " data-settings="show">
              <div class="crayon-nums-content" style="font-size: 12px !important; line-height: 15px !important;">
               <div class="crayon-num" data-line="crayon-57686c9c08706089098219-1">
                1
               </div>
               <div class="crayon-num crayon-striped-num" data-line="crayon-57686c9c08706089098219-2">
                2
               </div>
               <div class="crayon-num" data-line="crayon-57686c9c08706089098219-3">
                3
               </div>
               <div class="crayon-num crayon-striped-num" data-line="crayon-57686c9c08706089098219-4">
                4
               </div>
               <div class="crayon-num" data-line="crayon-57686c9c08706089098219-5">
                5
               </div>
              </div>
             </td>
             <td class="crayon-code">
              <div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;">
               <div class="crayon-line" id="crayon-57686c9c08706089098219-1">
                <span class="crayon-h">
                </span>
                <span class="crayon-t">
                 String
                </span>
                <span class="crayon-sy">
                 [
                </span>
                <span class="crayon-sy">
                 ]
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-v">
                 otherArgs
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-o">
                 =
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-r">
                 new
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-e">
                 GenericOptionsParser
                </span>
                <span class="crayon-sy">
                 (
                </span>
                <span class="crayon-v">
                 conf
                </span>
                <span class="crayon-sy">
                 ,
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-v">
                 args
                </span>
                <span class="crayon-sy">
                 )
                </span>
                <span class="crayon-sy">
                 .
                </span>
                <span class="crayon-e">
                 getRemainingArgs
                </span>
                <span class="crayon-sy">
                 (
                </span>
                <span class="crayon-sy">
                 )
                </span>
                <span class="crayon-sy">
                 ;
                </span>
               </div>
               <div class="crayon-line crayon-striped-line" id="crayon-57686c9c08706089098219-2">
                <span class="crayon-h">
                </span>
                <span class="crayon-st">
                 if
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-sy">
                 (
                </span>
                <span class="crayon-v">
                 otherArgs
                </span>
                <span class="crayon-sy">
                 .
                </span>
                <span class="crayon-v">
                 length
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-o">
                 !=
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-cn">
                 2
                </span>
                <span class="crayon-sy">
                 )
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-sy">
                 {
                </span>
               </div>
               <div class="crayon-line" id="crayon-57686c9c08706089098219-3">
                <span class="crayon-h">
                </span>
                <span class="crayon-v">
                 System
                </span>
                <span class="crayon-sy">
                 .
                </span>
                <span class="crayon-v">
                 err
                </span>
                <span class="crayon-sy">
                 .
                </span>
                <span class="crayon-e">
                 println
                </span>
                <span class="crayon-sy">
                 (
                </span>
                <span class="crayon-s">
                 "Usage: wordcount &amp;lt;in&amp;gt; &amp;lt;out&amp;gt;"
                </span>
                <span class="crayon-sy">
                 )
                </span>
                <span class="crayon-sy">
                 ;
                </span>
               </div>
               <div class="crayon-line crayon-striped-line" id="crayon-57686c9c08706089098219-4">
                <span class="crayon-h">
                </span>
                <span class="crayon-v">
                 System
                </span>
                <span class="crayon-sy">
                 .
                </span>
                <span class="crayon-e">
                 exit
                </span>
                <span class="crayon-sy">
                 (
                </span>
                <span class="crayon-cn">
                 2
                </span>
                <span class="crayon-sy">
                 )
                </span>
                <span class="crayon-sy">
                 ;
                </span>
               </div>
               <div class="crayon-line" id="crayon-57686c9c08706089098219-5">
                <span class="crayon-h">
                </span>
                <span class="crayon-sy">
                 }
                </span>
               </div>
              </div>
             </td>
            </tr>
           </tbody>
          </table>
         </div>
        </div>
        <!-- [Format Time: 0.0068 seconds] -->
       </div>
       <p>
        If的语句好理解，就是运行WordCount程序时候一定是两个参数，如果不是就会报错退出。至于第一句里的GenericOptionsParser类，它是用来解释常用hadoop命令，并根据需要为Configuration对象设置相应的值，其实平时开发里我们不太常用它，而是让类实现Tool接口，然后再main函数里使用ToolRunner运行程序，而ToolRunner内部会调用GenericOptionsParser。
       </p>
       <p>
        接下来的代码是：
       </p>
       <div class="cnblogs_code">
        <!-- Crayon Syntax Highlighter v_2.7.2_beta -->
        <div class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover" id="crayon-57686c9c0870d585739134" style=" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;">
         <div class="crayon-toolbar" data-settings=" mouseover overlay hide delay" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;">
          <span class="crayon-title">
          </span>
          <div class="crayon-tools" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;">
           <div class="crayon-button crayon-nums-button" title="切换是否显示行编号">
            <div class="crayon-button-icon">
            </div>
           </div>
           <div class="crayon-button crayon-plain-button" title="纯文本显示代码">
            <div class="crayon-button-icon">
            </div>
           </div>
           <div class="crayon-button crayon-wrap-button" title="切换自动换行">
            <div class="crayon-button-icon">
            </div>
           </div>
           <div class="crayon-button crayon-expand-button" title="点击展开代码">
            <div class="crayon-button-icon">
            </div>
           </div>
           <div class="crayon-button crayon-copy-button" title="复制代码">
            <div class="crayon-button-icon">
            </div>
           </div>
           <div class="crayon-button crayon-popup-button" title="在新窗口中显示代码">
            <div class="crayon-button-icon">
            </div>
           </div>
          </div>
         </div>
         <div class="crayon-info" style="min-height: 16.8px !important; line-height: 16.8px !important;">
         </div>
         <div class="crayon-plain-wrap">
          <textarea class="crayon-plain print-no" data-settings="dblclick" readonly="" style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;" wrap="soft">
           Job job = new Job(conf, "word count");
    job.setJarByClass(WordCount.class);
    job.setMapperClass(TokenizerMapper.class);
    job.setCombinerClass(IntSumReducer.class);
    job.setReducerClass(IntSumReducer.class);
          </textarea>
         </div>
         <div class="crayon-main" style="">
          <table class="crayon-table">
           <tbody>
            <tr class="crayon-row">
             <td class="crayon-nums " data-settings="show">
              <div class="crayon-nums-content" style="font-size: 12px !important; line-height: 15px !important;">
               <div class="crayon-num" data-line="crayon-57686c9c0870d585739134-1">
                1
               </div>
               <div class="crayon-num crayon-striped-num" data-line="crayon-57686c9c0870d585739134-2">
                2
               </div>
               <div class="crayon-num" data-line="crayon-57686c9c0870d585739134-3">
                3
               </div>
               <div class="crayon-num crayon-striped-num" data-line="crayon-57686c9c0870d585739134-4">
                4
               </div>
               <div class="crayon-num" data-line="crayon-57686c9c0870d585739134-5">
                5
               </div>
              </div>
             </td>
             <td class="crayon-code">
              <div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;">
               <div class="crayon-line" id="crayon-57686c9c0870d585739134-1">
                <span class="crayon-h">
                </span>
                <span class="crayon-e">
                 Job
                </span>
                <span class="crayon-v">
                 job
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-o">
                 =
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-r">
                 new
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-e">
                 Job
                </span>
                <span class="crayon-sy">
                 (
                </span>
                <span class="crayon-v">
                 conf
                </span>
                <span class="crayon-sy">
                 ,
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-s">
                 "word count"
                </span>
                <span class="crayon-sy">
                 )
                </span>
                <span class="crayon-sy">
                 ;
                </span>
               </div>
               <div class="crayon-line crayon-striped-line" id="crayon-57686c9c0870d585739134-2">
                <span class="crayon-h">
                </span>
                <span class="crayon-v">
                 job
                </span>
                <span class="crayon-sy">
                 .
                </span>
                <span class="crayon-e">
                 setJarByClass
                </span>
                <span class="crayon-sy">
                 (
                </span>
                <span class="crayon-v">
                 WordCount
                </span>
                <span class="crayon-sy">
                 .
                </span>
                <span class="crayon-t">
                 class
                </span>
                <span class="crayon-sy">
                 )
                </span>
                <span class="crayon-sy">
                 ;
                </span>
               </div>
               <div class="crayon-line" id="crayon-57686c9c0870d585739134-3">
                <span class="crayon-h">
                </span>
                <span class="crayon-v">
                 job
                </span>
                <span class="crayon-sy">
                 .
                </span>
                <span class="crayon-e">
                 setMapperClass
                </span>
                <span class="crayon-sy">
                 (
                </span>
                <span class="crayon-v">
                 TokenizerMapper
                </span>
                <span class="crayon-sy">
                 .
                </span>
                <span class="crayon-t">
                 class
                </span>
                <span class="crayon-sy">
                 )
                </span>
                <span class="crayon-sy">
                 ;
                </span>
               </div>
               <div class="crayon-line crayon-striped-line" id="crayon-57686c9c0870d585739134-4">
                <span class="crayon-h">
                </span>
                <span class="crayon-v">
                 job
                </span>
                <span class="crayon-sy">
                 .
                </span>
                <span class="crayon-e">
                 setCombinerClass
                </span>
                <span class="crayon-sy">
                 (
                </span>
                <span class="crayon-v">
                 IntSumReducer
                </span>
                <span class="crayon-sy">
                 .
                </span>
                <span class="crayon-t">
                 class
                </span>
                <span class="crayon-sy">
                 )
                </span>
                <span class="crayon-sy">
                 ;
                </span>
               </div>
               <div class="crayon-line" id="crayon-57686c9c0870d585739134-5">
                <span class="crayon-h">
                </span>
                <span class="crayon-v">
                 job
                </span>
                <span class="crayon-sy">
                 .
                </span>
                <span class="crayon-e">
                 setReducerClass
                </span>
                <span class="crayon-sy">
                 (
                </span>
                <span class="crayon-v">
                 IntSumReducer
                </span>
                <span class="crayon-sy">
                 .
                </span>
                <span class="crayon-t">
                 class
                </span>
                <span class="crayon-sy">
                 )
                </span>
                <span class="crayon-sy">
                 ;
                </span>
               </div>
              </div>
             </td>
            </tr>
           </tbody>
          </table>
         </div>
        </div>
        <!-- [Format Time: 0.0024 seconds] -->
       </div>
       <p>
        第一行就是在构建一个job，在mapreduce框架里一个mapreduce任务也叫mapreduce作业也叫做一个mapreduce的job，而具体的map和reduce运算就是task了，这里我们构建一个job，构建时候有两个参数，一个是conf这个就不累述了，一个是这个job的名称。
       </p>
       <p>
        第二行就是装载程序员编写好的计算程序，例如我们的程序类名就是WordCount了。这里我要做下纠正，虽然我们编写mapreduce程序只需要实现map函数和reduce函数，但是实际开发我们要实现三个类，第三个类是为了配置mapreduce如何运行map和reduce函数，准确的说就是构建一个mapreduce能执行的job了，例如WordCount类。
       </p>
       <p>
        第三行和第五行就是装载map函数和reduce函数实现类了，这里多了个第四行，这个是装载Combiner类，这个我后面讲mapreduce运行机制时候会讲述，其实本例去掉第四行也没有关系，但是使用了第四行理论上运行效率会更好。
       </p>
       <p>
        接下来的代码：
       </p>
       <div class="cnblogs_code">
        <!-- Crayon Syntax Highlighter v_2.7.2_beta -->
        <div class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover" id="crayon-57686c9c08714798347737" style=" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;">
         <div class="crayon-toolbar" data-settings=" mouseover overlay hide delay" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;">
          <span class="crayon-title">
          </span>
          <div class="crayon-tools" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;">
           <div class="crayon-button crayon-nums-button" title="切换是否显示行编号">
            <div class="crayon-button-icon">
            </div>
           </div>
           <div class="crayon-button crayon-plain-button" title="纯文本显示代码">
            <div class="crayon-button-icon">
            </div>
           </div>
           <div class="crayon-button crayon-wrap-button" title="切换自动换行">
            <div class="crayon-button-icon">
            </div>
           </div>
           <div class="crayon-button crayon-expand-button" title="点击展开代码">
            <div class="crayon-button-icon">
            </div>
           </div>
           <div class="crayon-button crayon-copy-button" title="复制代码">
            <div class="crayon-button-icon">
            </div>
           </div>
           <div class="crayon-button crayon-popup-button" title="在新窗口中显示代码">
            <div class="crayon-button-icon">
            </div>
           </div>
          </div>
         </div>
         <div class="crayon-info" style="min-height: 16.8px !important; line-height: 16.8px !important;">
         </div>
         <div class="crayon-plain-wrap">
          <textarea class="crayon-plain print-no" data-settings="dblclick" readonly="" style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;" wrap="soft">
           job.setOutputKeyClass(Text.class);
    job.setOutputValueClass(IntWritable.class);
          </textarea>
         </div>
         <div class="crayon-main" style="">
          <table class="crayon-table">
           <tbody>
            <tr class="crayon-row">
             <td class="crayon-nums " data-settings="show">
              <div class="crayon-nums-content" style="font-size: 12px !important; line-height: 15px !important;">
               <div class="crayon-num" data-line="crayon-57686c9c08714798347737-1">
                1
               </div>
               <div class="crayon-num crayon-striped-num" data-line="crayon-57686c9c08714798347737-2">
                2
               </div>
              </div>
             </td>
             <td class="crayon-code">
              <div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;">
               <div class="crayon-line" id="crayon-57686c9c08714798347737-1">
                <span class="crayon-h">
                </span>
                <span class="crayon-v">
                 job
                </span>
                <span class="crayon-sy">
                 .
                </span>
                <span class="crayon-e">
                 setOutputKeyClass
                </span>
                <span class="crayon-sy">
                 (
                </span>
                <span class="crayon-v">
                 Text
                </span>
                <span class="crayon-sy">
                 .
                </span>
                <span class="crayon-t">
                 class
                </span>
                <span class="crayon-sy">
                 )
                </span>
                <span class="crayon-sy">
                 ;
                </span>
               </div>
               <div class="crayon-line crayon-striped-line" id="crayon-57686c9c08714798347737-2">
                <span class="crayon-h">
                </span>
                <span class="crayon-v">
                 job
                </span>
                <span class="crayon-sy">
                 .
                </span>
                <span class="crayon-e">
                 setOutputValueClass
                </span>
                <span class="crayon-sy">
                 (
                </span>
                <span class="crayon-v">
                 IntWritable
                </span>
                <span class="crayon-sy">
                 .
                </span>
                <span class="crayon-t">
                 class
                </span>
                <span class="crayon-sy">
                 )
                </span>
                <span class="crayon-sy">
                 ;
                </span>
               </div>
              </div>
             </td>
            </tr>
           </tbody>
          </table>
         </div>
        </div>
        <!-- [Format Time: 0.0072 seconds] -->
       </div>
       <p>
        这个是定义输出的key/value的类型，也就是最终存储在hdfs上结果文件的key/value的类型。
       </p>
       <p>
        最后的代码是：
       </p>
       <div class="cnblogs_code">
        <!-- Crayon Syntax Highlighter v_2.7.2_beta -->
        <div class="crayon-syntax crayon-theme-classic crayon-font-monaco crayon-os-pc print-yes notranslate" data-settings=" minimize scroll-mouseover" id="crayon-57686c9c0871b339554525" style=" margin-top: 12px; margin-bottom: 12px; font-size: 12px !important; line-height: 15px !important;">
         <div class="crayon-toolbar" data-settings=" mouseover overlay hide delay" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;">
          <span class="crayon-title">
          </span>
          <div class="crayon-tools" style="font-size: 12px !important;height: 18px !important; line-height: 18px !important;">
           <div class="crayon-button crayon-nums-button" title="切换是否显示行编号">
            <div class="crayon-button-icon">
            </div>
           </div>
           <div class="crayon-button crayon-plain-button" title="纯文本显示代码">
            <div class="crayon-button-icon">
            </div>
           </div>
           <div class="crayon-button crayon-wrap-button" title="切换自动换行">
            <div class="crayon-button-icon">
            </div>
           </div>
           <div class="crayon-button crayon-expand-button" title="点击展开代码">
            <div class="crayon-button-icon">
            </div>
           </div>
           <div class="crayon-button crayon-copy-button" title="复制代码">
            <div class="crayon-button-icon">
            </div>
           </div>
           <div class="crayon-button crayon-popup-button" title="在新窗口中显示代码">
            <div class="crayon-button-icon">
            </div>
           </div>
          </div>
         </div>
         <div class="crayon-info" style="min-height: 16.8px !important; line-height: 16.8px !important;">
         </div>
         <div class="crayon-plain-wrap">
          <textarea class="crayon-plain print-no" data-settings="dblclick" readonly="" style="-moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4; font-size: 12px !important; line-height: 15px !important;" wrap="soft">
           FileInputFormat.addInputPath(job, new Path(otherArgs[0]));
    FileOutputFormat.setOutputPath(job, new Path(otherArgs[1]));
    System.exit(job.waitForCompletion(true) ? 0 : 1);
          </textarea>
         </div>
         <div class="crayon-main" style="">
          <table class="crayon-table">
           <tbody>
            <tr class="crayon-row">
             <td class="crayon-nums " data-settings="show">
              <div class="crayon-nums-content" style="font-size: 12px !important; line-height: 15px !important;">
               <div class="crayon-num" data-line="crayon-57686c9c0871b339554525-1">
                1
               </div>
               <div class="crayon-num crayon-striped-num" data-line="crayon-57686c9c0871b339554525-2">
                2
               </div>
               <div class="crayon-num" data-line="crayon-57686c9c0871b339554525-3">
                3
               </div>
              </div>
             </td>
             <td class="crayon-code">
              <div class="crayon-pre" style="font-size: 12px !important; line-height: 15px !important; -moz-tab-size:4; -o-tab-size:4; -webkit-tab-size:4; tab-size:4;">
               <div class="crayon-line" id="crayon-57686c9c0871b339554525-1">
                <span class="crayon-h">
                </span>
                <span class="crayon-v">
                 FileInputFormat
                </span>
                <span class="crayon-sy">
                 .
                </span>
                <span class="crayon-e">
                 addInputPath
                </span>
                <span class="crayon-sy">
                 (
                </span>
                <span class="crayon-v">
                 job
                </span>
                <span class="crayon-sy">
                 ,
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-r">
                 new
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-e">
                 Path
                </span>
                <span class="crayon-sy">
                 (
                </span>
                <span class="crayon-v">
                 otherArgs
                </span>
                <span class="crayon-sy">
                 [
                </span>
                <span class="crayon-cn">
                 0
                </span>
                <span class="crayon-sy">
                 ]
                </span>
                <span class="crayon-sy">
                 )
                </span>
                <span class="crayon-sy">
                 )
                </span>
                <span class="crayon-sy">
                 ;
                </span>
               </div>
               <div class="crayon-line crayon-striped-line" id="crayon-57686c9c0871b339554525-2">
                <span class="crayon-h">
                </span>
                <span class="crayon-v">
                 FileOutputFormat
                </span>
                <span class="crayon-sy">
                 .
                </span>
                <span class="crayon-e">
                 setOutputPath
                </span>
                <span class="crayon-sy">
                 (
                </span>
                <span class="crayon-v">
                 job
                </span>
                <span class="crayon-sy">
                 ,
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-r">
                 new
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-e">
                 Path
                </span>
                <span class="crayon-sy">
                 (
                </span>
                <span class="crayon-v">
                 otherArgs
                </span>
                <span class="crayon-sy">
                 [
                </span>
                <span class="crayon-cn">
                 1
                </span>
                <span class="crayon-sy">
                 ]
                </span>
                <span class="crayon-sy">
                 )
                </span>
                <span class="crayon-sy">
                 )
                </span>
                <span class="crayon-sy">
                 ;
                </span>
               </div>
               <div class="crayon-line" id="crayon-57686c9c0871b339554525-3">
                <span class="crayon-h">
                </span>
                <span class="crayon-v">
                 System
                </span>
                <span class="crayon-sy">
                 .
                </span>
                <span class="crayon-e">
                 exit
                </span>
                <span class="crayon-sy">
                 (
                </span>
                <span class="crayon-v">
                 job
                </span>
                <span class="crayon-sy">
                 .
                </span>
                <span class="crayon-e">
                 waitForCompletion
                </span>
                <span class="crayon-sy">
                 (
                </span>
                <span class="crayon-t">
                 true
                </span>
                <span class="crayon-sy">
                 )
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-sy">
                 ?
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-cn">
                 0
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-o">
                 :
                </span>
                <span class="crayon-h">
                </span>
                <span class="crayon-cn">
                 1
                </span>
                <span class="crayon-sy">
                 )
                </span>
                <span class="crayon-sy">
                 ;
                </span>
               </div>
              </div>
             </td>
            </tr>
           </tbody>
          </table>
         </div>
        </div>
        <!-- [Format Time: 0.0081 seconds] -->
       </div>
       <p>
        第一行就是构建输入的数据文件，第二行是构建输出的数据文件，最后一行如果job运行成功了，我们的程序就会正常退出。FileInputFormat和FileOutputFormat是很有学问的，我会在下面的mapreduce运行机制里讲解到它们。
       </p>
       <p>
        好了，mapreduce里的hello word程序讲解完毕，我这个讲解是从新办api进行，这套讲解在网络上还是比较少的，应该很具有代表性的。
       </p>
       <p>
        <strong>
         <em>
          Mapreduce
         </em>
        </strong>
        <strong>
         <em>
          运行机制
         </em>
        </strong>
       </p>
       <p>
        下面我要讲讲mapreduce的运行机制了，前不久我为公司出了一套hadoop面试题，里面就问道了mapreduce运行机制，出题时候我发现这个问题我自己似乎也将不太清楚，因此最近几天恶补了下，希望在本文里能说清楚这个问题。
       </p>
       <p>
        下面我贴出几张图，这些图都是我在百度图片里找到的比较好的图片：
       </p>
       <p>
        <em>
         图片一：
        </em>
       </p>
       <p>
        <a href="http://dataunion.org/wp-content/uploads/2015/02/1-1.jpg">
         <img src="http://dataunion.org/wp-content/uploads/2015/02/1-1.jpg"/>
        </a>
       </p>
       <p>
        <em>
         图片二：
        </em>
       </p>
       <p>
        <a href="http://dataunion.org/wp-content/uploads/2015/02/2-1.png">
         <img src="http://dataunion.org/wp-content/uploads/2015/02/2-1.png"/>
        </a>
       </p>
       <p>
        <em>
         图片三：
        </em>
       </p>
       <p>
        <a href="http://dataunion.org/wp-content/uploads/2015/02/3.jpg">
         <img src="http://dataunion.org/wp-content/uploads/2015/02/3.jpg"/>
        </a>
       </p>
       <p>
        <em>
         图片四：
        </em>
       </p>
       <p>
        <a href="http://dataunion.org/wp-content/uploads/2015/02/4-1.png">
         <img src="http://dataunion.org/wp-content/uploads/2015/02/4-1.png"/>
        </a>
       </p>
       <p>
        <em>
         图片五：
        </em>
       </p>
       <p>
        <a href="http://dataunion.org/wp-content/uploads/2015/02/5.jpg">
         <img src="http://dataunion.org/wp-content/uploads/2015/02/5.jpg"/>
        </a>
       </p>
       <p>
        <em>
         图片六：
        </em>
       </p>
       <p>
        <a href="http://dataunion.org/wp-content/uploads/2015/02/6.jpg">
         <img src="http://dataunion.org/wp-content/uploads/2015/02/6.jpg"/>
        </a>
       </p>
       <p>
        我现在学习技术很喜欢看图，每次有了新理解就会去看看图，每次都会有新的发现。
       </p>
       <p>
        谈mapreduce运行机制，可以从很多不同的角度来描述，比如说从mapreduce运行流程来讲解，也可以从计算模型的逻辑流程来进行讲解，也许有些深入理解了mapreduce运行机制还会从更好的角度来描述，但是将mapreduce运行机制有些东西是避免不了的，就是一个个参入的实例对象，一个就是计算模型的逻辑定义阶段，我这里讲解不从什么流程出发，就从这些一个个牵涉的对象，不管是物理实体还是逻辑实体。
       </p>
       <p>
        首先讲讲物理实体，参入mapreduce作业执行涉及4个独立的实体：
       </p>
       <ol>
        <li>
         客户端（client）：编写mapreduce程序，配置作业，提交作业，这就是程序员完成的工作；
        </li>
        <li>
         JobTracker：初始化作业，分配作业，与TaskTracker通信，协调整个作业的执行；
        </li>
        <li>
         TaskTracker：保持与JobTracker的通信，在分配的数据片段上执行Map或Reduce任务，TaskTracker和JobTracker的不同有个很重要的方面，就是在执行任务时候TaskTracker可以有n多个，JobTracker则只会有一个（JobTracker只能有一个就和hdfs里namenode一样存在单点故障，我会在后面的mapreduce的相关问题里讲到这个问题的）
        </li>
        <li>
         Hdfs：保存作业的数据、配置信息等等，最后的结果也是保存在hdfs上面
        </li>
       </ol>
       <p>
        <em>
         那么mapreduce到底是如何运行的呢？
        </em>
       </p>
       <p>
       </p>
       <p>
        首先是客户端要编写好mapreduce程序，配置好mapreduce的作业也就是job，接下来就是提交job了，提交job是提交到JobTracker上的，这个时候JobTracker就会构建这个job，具体就是分配一个新的job任务的ID值，接下来它会做检查操作，这个检查就是确定输出目录是否存在，如果存在那么job就不能正常运行下去，JobTracker会抛出错误给客户端，接下来还要检查输入目录是否存在，如果不存在同样抛出错误，如果存在JobTracker会根据输入计算输入分片（Input Split），如果分片计算不出来也会抛出错误，至于输入分片我后面会做讲解的，这些都做好了JobTracker就会配置Job需要的资源了。分配好资源后，JobTracker就会初始化作业，初始化主要做的是将Job放入一个内部的队列，让配置好的作业调度器能调度到这个作业，作业调度器会初始化这个job，初始化就是创建一个正在运行的job对象（封装任务和记录信息），以便JobTracker跟踪job的状态和进程。初始化完毕后，作业调度器会获取输入分片信息（input split），每个分片创建一个map任务。接下来就是任务分配了，这个时候tasktracker会运行一个简单的循环机制定期发送心跳给jobtracker，心跳间隔是5秒，程序员可以配置这个时间，心跳就是jobtracker和tasktracker沟通的桥梁，通过心跳，jobtracker可以监控tasktracker是否存活，也可以获取tasktracker处理的状态和问题，同时tasktracker也可以通过心跳里的返回值获取jobtracker给它的操作指令。任务分配好后就是执行任务了。在任务执行时候jobtracker可以通过心跳机制监控tasktracker的状态和进度，同时也能计算出整个job的状态和进度，而tasktracker也可以本地监控自己的状态和进度。当jobtracker获得了最后一个完成指定任务的tasktracker操作成功的通知时候，jobtracker会把整个job状态置为成功，然后当客户端查询job运行状态时候（注意：这个是异步操作），客户端会查到job完成的通知的。如果job中途失败，mapreduce也会有相应机制处理，一般而言如果不是程序员程序本身有bug，mapreduce错误处理机制都能保证提交的job能正常完成。
       </p>
       <p>
       </p>
       <p>
        下面我从逻辑实体的角度讲解mapreduce运行机制，这些按照时间顺序包括：
        <strong>
         <em>
          输入分片（
         </em>
        </strong>
        <strong>
         <em>
          input split
         </em>
        </strong>
        <strong>
         <em>
          ）、map
         </em>
        </strong>
        <strong>
         <em>
          阶段、combiner
         </em>
        </strong>
        <strong>
         <em>
          阶段、shuffle
         </em>
        </strong>
        <strong>
         <em>
          阶段和reduce
         </em>
        </strong>
        <strong>
         <em>
          阶段
         </em>
        </strong>
        。
       </p>
       <ol>
        <li>
         <strong>
          输入分片（input split
         </strong>
         <strong>
          ）：
         </strong>
         在进行map计算之前，mapreduce会根据输入文件计算输入分片（input split），每个输入分片（input split）针对一个map任务，输入分片（input split）存储的并非数据本身，而是一个分片长度和一个记录数据的位置的数组，输入分片（input split）往往和hdfs的block（块）关系很密切，假如我们设定hdfs的块的大小是64mb，如果我们输入有三个文件，大小分别是3mb、65mb和127mb，那么mapreduce会把3mb文件分为一个输入分片（input split），65mb则是两个输入分片（input split）而127mb也是两个输入分片（input split），换句话说我们如果在map计算前做输入分片调整，例如合并小文件，那么就会有5个map任务将执行，而且每个map执行的数据大小不均，这个也是mapreduce优化计算的一个关键点。
        </li>
        <li>
         <strong>
          map
         </strong>
         <strong>
          阶段：
         </strong>
         就是程序员编写好的map函数了，因此map函数效率相对好控制，而且一般map操作都是本地化操作也就是在数据存储节点上进行；
        </li>
        <li>
         <strong>
          combiner
         </strong>
         <strong>
          阶段：c
         </strong>
         ombiner阶段是程序员可以选择的，combiner其实也是一种reduce操作，因此我们看见WordCount类里是用reduce进行加载的。Combiner是一个本地化的reduce操作，它是map运算的后续操作，主要是在map计算出中间文件前做一个简单的合并重复key值的操作，例如我们对文件里的单词频率做统计，map计算时候如果碰到一个hadoop的单词就会记录为1，但是这篇文章里hadoop可能会出现n多次，那么map输出文件冗余就会很多，因此在reduce计算前对相同的key做一个合并操作，那么文件会变小，这样就提高了宽带的传输效率，毕竟hadoop计算力宽带资源往往是计算的瓶颈也是最为宝贵的资源，但是combiner操作是有风险的，使用它的原则是combiner的输入不会影响到reduce计算的最终输入，例如：如果计算只是求总数，最大值，最小值可以使用combiner，但是做平均值计算使用combiner的话，最终的reduce计算结果就会出错。
        </li>
        <li>
         <strong>
          shuffle
         </strong>
         <strong>
          阶段：
         </strong>
         将map的输出作为reduce的输入的过程就是shuffle了，这个是mapreduce优化的重点地方。这里我不讲怎么优化shuffle阶段，讲讲shuffle阶段的原理，因为大部分的书籍里都没讲清楚shuffle阶段。Shuffle一开始就是map阶段做输出操作，一般mapreduce计算的都是海量数据，map输出时候不可能把所有文件都放到内存操作，因此map写入磁盘的过程十分的复杂，更何况map输出时候要对结果进行排序，内存开销是很大的，map在做输出时候会在内存里开启一个环形内存缓冲区，这个缓冲区专门用来输出的，默认大小是100mb，并且在配置文件里为这个缓冲区设定了一个阀值，默认是0.80（这个大小和阀值都是可以在配置文件里进行配置的），同时map还会为输出操作启动一个守护线程，如果缓冲区的内存达到了阀值的80%时候，这个守护线程就会把内容写到磁盘上，这个过程叫spill，另外的20%内存可以继续写入要写进磁盘的数据，写入磁盘和写入内存操作是互不干扰的，如果缓存区被撑满了，那么map就会阻塞写入内存的操作，让写入磁盘操作完成后再继续执行写入内存操作，前面我讲到写入磁盘前会有个排序操作，这个是在写入磁盘操作时候进行，不是在写入内存时候进行的，如果我们定义了combiner函数，那么排序前还会执行combiner操作。每次spill操作也就是写入磁盘操作时候就会写一个溢出文件，也就是说在做map输出有几次spill就会产生多少个溢出文件，等map输出全部做完后，map会合并这些输出文件。这个过程里还会有一个Partitioner操作，对于这个操作很多人都很迷糊，其实Partitioner操作和map阶段的输入分片（Input split）很像，一个Partitioner对应一个reduce作业，如果我们mapreduce操作只有一个reduce操作，那么Partitioner就只有一个，如果我们有多个reduce操作，那么Partitioner对应的就会有多个，Partitioner因此就是reduce的输入分片，这个程序员可以编程控制，主要是根据实际key和value的值，根据实际业务类型或者为了更好的reduce负载均衡要求进行，这是提高reduce效率的一个关键所在。到了reduce阶段就是合并map输出文件了，Partitioner会找到对应的map输出文件，然后进行复制操作，复制操作时reduce会开启几个复制线程，这些线程默认个数是5个，程序员也可以在配置文件更改复制线程的个数，这个复制过程和map写入磁盘过程类似，也有阀值和内存大小，阀值一样可以在配置文件里配置，而内存大小是直接使用reduce的tasktracker的内存大小，复制时候reduce还会进行排序操作和合并文件操作，这些操作完了就会进行reduce计算了。
        </li>
        <li>
         <strong>
          reduce
         </strong>
         <strong>
          阶段
         </strong>
         ：和map函数一样也是程序员编写的，最终结果是存储在hdfs上的。
        </li>
       </ol>
       <p>
        <strong>
         Mapreduce
        </strong>
        <strong>
         的相关问题
        </strong>
       </p>
       <p>
        这里我要谈谈我学习mapreduce思考的一些问题，都是我自己想出解释的问题，但是某些问题到底对不对，就要广大童鞋帮我确认了。
       </p>
       <ol>
        <li>
         jobtracker的单点故障：jobtracker和hdfs的namenode一样也存在单点故障，单点故障一直是hadoop被人诟病的大问题，为什么hadoop的做的文件系统和mapreduce计算框架都是高容错的，但是最重要的管理节点的故障机制却如此不好，我认为主要是namenode和jobtracker在实际运行中都是在内存操作，而做到内存的容错就比较复杂了，只有当内存数据被持久化后容错才好做，namenode和jobtracker都可以备份自己持久化的文件，但是这个持久化都会有延迟，因此真的出故障，任然不能整体恢复，另外hadoop框架里包含zookeeper框架，zookeeper可以结合jobtracker，用几台机器同时部署jobtracker，保证一台出故障，有一台马上能补充上，不过这种方式也没法恢复正在跑的mapreduce任务。
        </li>
        <li>
         做mapreduce计算时候，输出一般是一个文件夹，而且该文件夹是不能存在，我在出面试题时候提到了这个问题，而且这个检查做的很早，当我们提交job时候就会进行，mapreduce之所以这么设计是保证数据可靠性，如果输出目录存在reduce就搞不清楚你到底是要追加还是覆盖，不管是追加和覆盖操作都会有可能导致最终结果出问题，mapreduce是做海量数据计算，一个生产计算的成本很高，例如一个job完全执行完可能要几个小时，因此一切影响错误的情况mapreduce是零容忍的。
        </li>
        <li>
         Mapreduce还有一个InputFormat和OutputFormat，我们在编写map函数时候发现map方法的参数是之间操作行数据，没有牵涉到InputFormat，这些事情在我们new Path时候mapreduce计算框架帮我们做好了，而OutputFormat也是reduce帮我们做好了，我们使用什么样的输入文件，就要调用什么样的InputFormat，InputFormat是和我们输入的文件类型相关的，mapreduce里常用的InputFormat有FileInputFormat普通文本文件，SequenceFileInputFormat是指hadoop的序列化文件，另外还有KeyValueTextInputFormat。OutputFormat就是我们想最终存储到hdfs系统上的文件格式了，这个根据你需要定义了，hadoop有支持很多文件格式，这里不一一列举，想知道百度下就看到了。
        </li>
       </ol>
       <p>
        好了，文章写完了，呵呵，这篇我自己感觉写的不错，是目前hadoop系列文章里写的最好的，我后面会再接再厉的。加油！！！
       </p>
       <p>
       </p>
       <p>
        文章出处：
        <a href="http://www.cnblogs.com/sharpxiajun/p/3151395.html">
         http://www.cnblogs.com/sharpxiajun/p/3151395.html
        </a>
       </p>
      </div>
      <div>
       <strong>
        注：转载文章均来自于公开网络，仅供学习使用，不会用于任何商业用途，如果侵犯到原作者的权益，请您与我们联系删除或者授权事宜，联系邮箱：contact@dataunion.org。转载数盟网站文章请注明原文章作者，否则产生的任何版权纠纷与数盟无关。
       </strong>
      </div>
      <!--content_text-->
      <div class="fenxian">
       <!-- JiaThis Button BEGIN -->
       <div class="jiathis_style_32x32">
        <p class="jiathis_button_weixin">
        </p>
        <p class="jiathis_button_tsina">
        </p>
        <p class="jiathis_button_qzone">
        </p>
        <p class="jiathis_button_cqq">
        </p>
        <p class="jiathis_button_tumblr">
        </p>
        <a class="jiathis jiathis_txt jtico jtico_jiathis" href="http://www.jiathis.com/share" target="_blank">
        </a>
        <p class="jiathis_counter_style">
        </p>
       </div>
       <!-- JiaThis Button END -->
      </div>
     </article>
     <!--content-->
     <!--相关文章-->
     <div class="xianguan">
      <div class="xianguantitle">
       相关文章！
      </div>
      <ul class="pic">
       <li>
        <a href="http://dataunion.org/16939.html">
         <img src="http://dataunion.org/wp-content/uploads/2015/05/t0132d08d0133e2e156-300x219.png"/>
        </a>
        <a class="link" href="http://dataunion.org/16939.html" rel="bookmark" title="腾讯大数据之TDW计算引擎解析——Shuffle">
         腾讯大数据之TDW计算引擎解析——Shuffle
        </a>
       </li>
       <li>
        <a href="http://dataunion.org/24670.html">
         <img src="http://dataunion.org/wp-content/uploads/2016/03/20141222134630106-300x164.png"/>
        </a>
        <a class="link" href="http://dataunion.org/24670.html" rel="bookmark" title="Apache Spark 不过时的六大理由">
         Apache Spark 不过时的六大理由
        </a>
       </li>
       <li>
        <a href="http://dataunion.org/24558.html">
         <img src="http://dataunion.org/wp-content/uploads/2016/06/wKiom1dcvqDBYzojAAF3j3hfL_s877.jpg-wh_651x-s_1673119543-300x197.jpg"/>
        </a>
        <a class="link" href="http://dataunion.org/24558.html" rel="bookmark" title="实现R与Hadoop联合作业的三种方法">
         实现R与Hadoop联合作业的三种方法
        </a>
       </li>
       <li>
        <a href="http://dataunion.org/24454.html">
         <img src="http://dataunion.org/wp-content/uploads/2016/06/234040u557x77z325w2g3o-267x200.jpg"/>
        </a>
        <a class="link" href="http://dataunion.org/24454.html" rel="bookmark" title="LinkedIn 开源其分布式对象存储系统 Ambry">
         LinkedIn 开源其分布式对象存储系统 Ambry
        </a>
       </li>
      </ul>
     </div>
     <!--相关文章-->
     <div class="comment" id="comments">
      <!-- You can start editing here. -->
      <!-- If comments are open, but there are no comments. -->
      <div class="title">
       期待你一针见血的评论，Come on！
      </div>
      <div id="respond">
       <p>
        不用想啦，马上
        <a href="http://dataunion.org/wp-login.php?redirect_to=http%3A%2F%2Fdataunion.org%2F10337.html">
         "登录"
        </a>
        发表自已的想法.
       </p>
      </div>
     </div>
     <!-- .nav-single -->
    </div>
    <!--Container End-->
    <aside id="sitebar">
     <div class="sitebar_list2">
      <div class="wptag">
       <span class="tagtitle">
        热门标签+
       </span>
       <div class="tagg">
        <ul class="menu" id="menu-%e5%8f%8b%e6%83%85%e9%93%be%e6%8e%a5">
         <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-1605" id="menu-item-1605">
          <a href="http://taidizh.com/">
           泰迪智慧
          </a>
         </li>
         <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-20884" id="menu-item-20884">
          <a href="http://www.transwarp.cn/">
           星环科技
          </a>
         </li>
         <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-3538" id="menu-item-3538">
          <a href="http://datall.org/">
           珈和遥感
          </a>
         </li>
         <li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-20888" id="menu-item-20888">
          <a href="http://www.chinahadoop.cn/">
           小象学院
          </a>
         </li>
        </ul>
       </div>
      </div>
     </div>
     <div class="sitebar_list">
      <div class="textwidget">
       <div align="center">
        <a href="http://study.163.com/course/courseMain.htm?courseId=991022" target="_blank">
         <img src="http://dataunion.org/wp-content/uploads/2016/03/dv.jpg"/>
        </a>
       </div>
      </div>
     </div>
     <div class="sitebar_list">
      <h4 class="sitebar_title">
       文章分类
      </h4>
      <div class="tagcloud">
       <a class="tag-link-44" href="http://dataunion.org/category/industry/demo" style="font-size: 10.204724409449pt;" title="4个话题">
        Demo展示
       </a>
       <a class="tag-link-31" href="http://dataunion.org/category/experts" style="font-size: 15.826771653543pt;" title="52个话题">
        专家团队
       </a>
       <a class="tag-link-870" href="http://dataunion.org/category/tech/ai" style="font-size: 19.795275590551pt;" title="273个话题">
        人工智能
       </a>
       <a class="tag-link-488" href="http://dataunion.org/category/%e5%8a%a0%e5%85%a5%e6%95%b0%e7%9b%9f" style="font-size: 8pt;" title="1个话题">
        加入数盟
       </a>
       <a class="tag-link-869" href="http://dataunion.org/category/tech/viz" style="font-size: 17.204724409449pt;" title="93个话题">
        可视化
       </a>
       <a class="tag-link-30" href="http://dataunion.org/category/partners" style="font-size: 10.645669291339pt;" title="5个话题">
        合作伙伴
       </a>
       <a class="tag-link-889" href="http://dataunion.org/category/parterc" style="font-size: 11.582677165354pt;" title="8个话题">
        合作会议
       </a>
       <a class="tag-link-104" href="http://dataunion.org/category/books" style="font-size: 12.96062992126pt;" title="15个话题">
        图书
       </a>
       <a class="tag-link-220" href="http://dataunion.org/category/tech/base" style="font-size: 19.850393700787pt;" title="281个话题">
        基础架构
       </a>
       <a class="tag-link-219" href="http://dataunion.org/category/tech/analysis" style="font-size: 19.409448818898pt;" title="232个话题">
        数据分析
       </a>
       <a class="tag-link-887" href="http://dataunion.org/category/tech/dm" style="font-size: 13.291338582677pt;" title="17个话题">
        数据挖掘
       </a>
       <a class="tag-link-34" href="http://dataunion.org/category/tech" style="font-size: 20.732283464567pt;" title="404个话题">
        文章
       </a>
       <a class="tag-link-1" href="http://dataunion.org/category/uncategorized" style="font-size: 22pt;" title="693个话题">
        未分类
       </a>
       <a class="tag-link-4" href="http://dataunion.org/category/events" style="font-size: 14.503937007874pt;" title="29个话题">
        活动
       </a>
       <a class="tag-link-890" href="http://dataunion.org/category/tech/%e6%b7%b1%e5%ba%a6%e5%ad%a6%e4%b9%a0" style="font-size: 10.204724409449pt;" title="4个话题">
        深度学习
       </a>
       <a class="tag-link-221" href="http://dataunion.org/category/tech/devl" style="font-size: 18.968503937008pt;" title="193个话题">
        编程语言
       </a>
       <a class="tag-link-888" href="http://dataunion.org/category/career" style="font-size: 15.661417322835pt;" title="48个话题">
        职业规划
       </a>
       <a class="tag-link-5" href="http://dataunion.org/category/jobs" style="font-size: 14.11811023622pt;" title="25个话题">
        职位
       </a>
       <a class="tag-link-871" href="http://dataunion.org/category/industry" style="font-size: 15.716535433071pt;" title="49个话题">
        行业
       </a>
       <a class="tag-link-613" href="http://dataunion.org/category/industry/case" style="font-size: 16.984251968504pt;" title="84个话题">
        行业应用
       </a>
       <a class="tag-link-885" href="http://dataunion.org/category/industry/news" style="font-size: 17.425196850394pt;" title="102个话题">
        行业资讯
       </a>
       <a class="tag-link-10" href="http://dataunion.org/category/training" style="font-size: 14.228346456693pt;" title="26个话题">
        课程
       </a>
       <a class="tag-link-16" href="http://dataunion.org/category/sources" style="font-size: 15.661417322835pt;" title="48个话题">
        资源
       </a>
      </div>
     </div>
     <div class="sitebar_list">
      <h4 class="sitebar_title">
       功能
      </h4>
      <ul>
       <li>
        <a href="http://dataunion.org/wp-login.php?action=register">
         注册
        </a>
       </li>
       <li>
        <a href="http://dataunion.org/wp-login.php">
         登录
        </a>
       </li>
       <li>
        <a href="http://dataunion.org/feed">
         文章
         <abbr title="Really Simple Syndication">
          RSS
         </abbr>
        </a>
       </li>
       <li>
        <a href="http://dataunion.org/comments/feed">
         评论
         <abbr title="Really Simple Syndication">
          RSS
         </abbr>
        </a>
       </li>
       <li>
        <a href="https://cn.wordpress.org/" title="基于WordPress，一个优美、先进的个人信息发布平台。">
         WordPress.org
        </a>
       </li>
      </ul>
     </div>
    </aside>
    <div class="clear">
    </div>
   </div>
   <!--main-->
   ﻿
   <footer id="dibu">
    <div class="about">
     <div class="right">
      <ul class="menu" id="menu-%e5%ba%95%e9%83%a8%e8%8f%9c%e5%8d%95">
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-18024" id="menu-item-18024">
        <a href="http://dataunion.org/category/partners">
         合作伙伴
        </a>
       </li>
       <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-20881" id="menu-item-20881">
        <a href="http://dataunion.org/contribute">
         文章投稿
        </a>
       </li>
       <li class="menu-item menu-item-type-taxonomy menu-item-object-category menu-item-20872" id="menu-item-20872">
        <a href="http://dataunion.org/category/%e5%8a%a0%e5%85%a5%e6%95%b0%e7%9b%9f">
         加入数盟
        </a>
       </li>
       <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-22441" id="menu-item-22441">
        <a href="http://dataunion.org/f-links">
         友情链接
        </a>
       </li>
       <li class="menu-item menu-item-type-post_type menu-item-object-page menu-item-20874" id="menu-item-20874">
        <a href="http://dataunion.org/aboutus">
         关于数盟
        </a>
       </li>
      </ul>
      <p class="banquan">
       数盟社区        ，
        做最棒的数据科学社区
      </p>
     </div>
     <div class="left">
      <ul class="bottomlist">
       <li>
        <a href="http://weibo.com/DataScientistUnion  " target="_blank" 　title="">
         <img src="http://dataunion.org/wp-content/themes/yzipi/images/weibo.png"/>
        </a>
       </li>
       <li>
        <a class="cd-popup-trigger" href="http://dataunion.org/10337.html#0">
         <img src="http://dataunion.org/wp-content/themes/yzipi/images/weixin.png"/>
        </a>
       </li>
      </ul>
      <div class="cd-popup">
       <div class="cd-popup-container">
        <h1>
         扫描二维码,加微信公众号
        </h1>
        <img src="http://dataunion.org/wp-content/themes/yzipi/images/2014-12-06-1515289049.png"/>
        <a class="cd-popup-close" href="http://dataunion.org/10337.html">
        </a>
       </div>
       <!-- cd-popup-container -->
      </div>
      <!-- cd-popup -->
     </div>
    </div>
    <!--about-->
    <div class="bottom">
     <a href="http://dataunion.org/">
      数盟社区
     </a>
     <a href="http://www.miitbeian.gov.cn/" rel="external nofollow" target="_blank">
      京ICP备14026740号
     </a>
     联系我们：
     <a href="mailto:contact@dataunion.org" target="_blank">
      contact@dataunion.org
     </a>
     <div class="tongji">
     </div>
     <!--bottom-->
     <div class="scroll" id="scroll" style="display:none;">
      ︿
     </div>
    </div>
   </footer>
   <!--dibu-->
  </div>
 </body>
</html>